现在我们已经完成了计划,我们将引入一个称为协议的新对象。协议协调一系列计划,并将其部署在远方的工作人员上并一次性运行它们。
它是一个高级对象,其中包含分布在多个工作程序中的复杂计算的逻辑。协议的主要特征是能够在工作人员之间发送/搜索/取回,并最终部署到确定的工作人员中。因此,用户可以设计协议,然后将其上载到Cloud Worker,其他任何Worker都可以搜索,下载并在其所连接的Worker上应用其包含的计算程序。
让我们看看如何使用它!
作者:
中文版译者:
通过提供(worker,plan)
对的列表来创建协议。“worker”可以是工作机,也可以是工人ID,也可以是表示虚拟工人的字符串。在创建时可以使用后一种情况来指定部署时同一工作机应拥有(或不拥有)两个计划。“计划”可以是计划,也可以是PointerPlan(计划指针)。
In [ ]:
import torch as th
import syft as sy
hook = sy.TorchHook(th)
# IMPORTANT: Local worker should not be a client worker
hook.local_worker.is_client_worker = False
让我们定义3个计划并将其提供给协议。 它们都执行增量操作。
In [ ]:
@sy.func2plan(args_shape=[(1,)])
def inc1(x):
return x + 1
@sy.func2plan(args_shape=[(1,)])
def inc2(x):
return x + 1
@sy.func2plan(args_shape=[(1,)])
def inc3(x):
return x + 1
protocol = sy.Protocol([("worker1", inc1), ("worker2", inc2), ("worker3", inc3)])
现在我们需要将协议绑定到工作机,这是通过调用.deploy(* workers)
完成的。让我们创建一些工作机。
In [ ]:
bob = sy.VirtualWorker(hook, id="bob")
alice = sy.VirtualWorker(hook, id="alice")
charlie = sy.VirtualWorker(hook, id="charlie")
In [ ]:
workers = alice, bob, charlie
protocol.deploy(*workers)
您会看到计划已经发送给适当的工作人员:已经部署好了!
这已分两个阶段完成:首先,我们将创建时提供的虚拟工作程序(以字符串命名)映射到提供的工作程序,其次,我们将相应的计划发送给每个工作机。
In [ ]:
x = th.tensor([1.0])
ptr = protocol.run(x)
ptr
In [ ]:
ptr.get()
输入1.0经历了3个计划,因此已经增加了3倍,这就是现在等于4.0的原因!
实际上,您还可以在某些指向数据的指针上远程运行协议:
In [ ]:
james = sy.VirtualWorker(hook, id="james")
In [ ]:
protocol.send(james)
In [ ]:
x = th.tensor([1.0]).send(james)
ptr = protocol.run(x)
ptr
如您所见,结果是一个指向James的指针
In [ ]:
ptr = ptr.get()
ptr
In [ ]:
ptr = ptr.get()
ptr
让我们初始化一个尚未部署的协议,然后将其放在远程工作器上
In [ ]:
protocol = sy.Protocol([("worker1", inc1), ("worker2", inc2), ("worker3", inc3)])
protocol.tag('my_protocol')
protocol.send(james)
In [ ]:
me = sy.hook.local_worker # 以本地工作机的身份与我联系
现在我们开始搜索以找到协议
In [ ]:
responses = me.request_search(['my_protocol'], location=james)
responses
您有权访问协议的指针
In [ ]:
ptr_protocol = responses[0]
像通常的指针一样,您可以将其取回:
In [ ]:
protocol_back = ptr_protocol.get()
protocol_back
我们可以像在第1和第2部分中所做的那样进行操作。
In [ ]:
protocol_back.deploy(alice, bob, charlie)
x = th.tensor([1.0])
ptr = protocol_back.run(x)
ptr.get()
协议将附带更多实际示例,但您已经可以看到此新对象带来的所有可能性!
祝贺您完成本笔记本教程! 如果您喜欢此方法,并希望加入保护隐私、去中心化AI和AI供应链(数据)所有权的运动,则可以通过以下方式做到这一点!
帮助我们的社区的最简单方法是仅通过给GitHub存储库加注星标! 这有助于提高人们对我们正在构建的出色工具的认识。
我们编写了非常不错的教程,以更好地了解联合学习和隐私保护学习的外观,以及我们如何为实现这一目标添砖加瓦。
保持最新进展的最佳方法是加入我们的社区! 您可以通过填写以下表格来做到这一点http://slack.openmined.org
对我们的社区做出贡献的最好方法是成为代码贡献者! 您随时可以转到PySyft GitHub的Issue页面并过滤“projects”。这将向您显示所有概述,选择您可以加入的项目!如果您不想加入项目,但是想做一些编码,则还可以通过搜索标记为“good first issue”的GitHub问题来寻找更多的“一次性”微型项目。
如果您没有时间为我们的代码库做贡献,但仍想提供支持,那么您也可以成为Open Collective的支持者。所有捐款都将用于我们的网络托管和其他社区支出,例如黑客马拉松和聚会!
In [ ]: